package com.innerclass_;

/**
 * @Author 小闽
 * @Date 2024/9/17 16:17
 * @PackageName: com.innerclass_
 * @ClassName: AnonymousInnerDetailClass
 * @Description: 匿名内部类细节
 * @Version 1.0
 */
public class AnonymousInnerDetailClass {
    public static void main(String[] args) {
        // 实例化外部类对象
        Outer05 outer05 = new Outer05();
        // 调用f1()的方法。
        outer05.f1();
    }
}
class Outer05{
    private int n1 = 99;
    public void f1(){
        //如果外部类和内部类的成员重名时，内部类访问的话，默认遵循就近原则，
        // 如果想访问外部类的成员，则可以使用（外部类名.this.成员）去访问。
        Person person = new Person(){    // 匿名内部类是Outer05$1
            private int n1 = 88;
            @Override
            public void hi() {
                System.out.println("匿名内部类重写了hi()方法...");
                System.out.println("n1=" + n1);
                System.out.println("外部类的n1=" + Outer05.this.n1);
            }

            @Override
            public void ok(String str) {
                super.ok(str);
            }
        };
        // 如果匿名内部类中没有去实现hi()方法的重写，则会根据多态的动态绑定机制去执行Person类中hi()方法。
        // 调用方式可以是
        person.hi();
        // 对象名.方法名
        // 也可以是
        /*
            new Person(){
                @Override
                public void hi() {
                    System.out.println("匿名内部类重写了hi()方法...");
                }
            }.hi();
         */
        new Person(){
            @Override
            public void hi() {
                System.out.println("匿名内部类重写了hi()方法...");
            }

            @Override
            public void ok(String str) {
                super.ok(str);
            }
        }.ok("苏宁易购");
        // 实现抽象类的匿名内部类
        // 对于抽象类的匿名内部类也是如此
        Bird bird = new Bird(){
            @Override
            void fly() {
                System.out.println("小鸟在飞翔1...");
            }
        };
        bird.fly();
        new Bird(){
            @Override
            void fly() {
                System.out.println("小鸟在飞翔2...");
            }
        }.fly();
    }
}
class Person{
    public void hi(){
        System.out.println("Person hi()");
    }
    public void ok(String str){
        System.out.println("Person ok=" + str);
    }
}
// 抽象类/接口
abstract class Bird{
    abstract void fly();
}